#pragma once

#include <iostream>
#include <TFile.h>
#include <TTree.h>
#include <vector>
#include <TH1I.h>
#include <TF1.h>
#include <TCanvas.h>
#include <TGraphErrors.h>
#include <iomanip>
#include <TStyle.h>

#include <fstream>
#include <string>
#include <vector>
#include <filesystem>
#include <algorithm>
#include <numeric>
#include <bitset>
#include <sstream>
#include <cstdio>
#include <chrono>
#include <sys/types.h>
#include <sys/stat.h>
#include "constant.hh"
namespace fs = std::filesystem;
using namespace std;

class unpack_process
{
public:
  unpack_process(string input_file, int asic_num, string root_filename,
                 bool is_write_txt, bool is_base_data, bool is_set_same_rms,
                 double LSB, int thresh_limit, string save_path,
                 string file_write, bool is_extra_trigger);
  ~unpack_process();

  bool is_extra_trigger;
  bool is_set_same_rms;
  int asic_num;
  double LSB;
  int thresh_limit;
  string input_file;
  vector<uint32_t> initial_data;
  vector<vector<vector<uint32_t>>> ch;
  vector<vector<vector<uint32_t>>> amp;

  vector<vector<uint32_t>> data;
  vector<vector<uint32_t>> dataidx;
  string save_path;
  string file_write;

private:
    // 前期处理
    int header = 44047;
    int ender = 1077438054;
    vector<uint32_t> start_index;
    vector<uint32_t> end_index;
    vector<uint32_t> cnt_idx;
    vector<vector<uint32_t>> adc_data;

    vector<vector<uint32_t>> adas_idx;
    vector<vector<uint32_t>> adas_chl;
    vector<vector<uint32_t>> adas_amp;
    vector<uint32_t> trig;

    TFile *adas_hit_file;
    TTree *adas_hit_tree;
    int nhits;
    int triggerid;
    int adas_hit_idx[2560];
    int adas_hit_chl[2560];
    int adas_hit_amp[2560];

    // 解包
    bool init_file();
    bool init_file1();
    // 基线处理
    void base_data();
    // 计算基线mean、rms和threshold
    void clac_base_rms(vector<vector<uint32_t>> data, vector<vector<uint32_t>> &base, vector<double> &means, vector<double> &rms, vector<double> &threshold, vector<double> &rms_bin, vector<double> &rms128, vector<double> &means128);
    // 画图
    void draw(vector<vector<double>> means, vector<vector<double>> rms);

    // 将阈值转换为usb输入文件
    void threshold_to_usb(vector<double> threshold);
    void threshold_to_usb_new(vector<double> threshold);
    void threshold_to_gbt(vector<double> threshold);
    void threshold_to_gbt_same(vector<double> threshold);

    // 初始化root文件
    bool init_root(string);
    // 将解包的数据 写入root文件 待后续解码分析
    void write_root();
    // 写入txt文件 没什么用
    void write_txt(string);

    // 将基线mean、rms和threshold写入txt文件
    void write_base_txt(vector<vector<double>> means, vector<vector<double>> rms, vector<vector<double>> threshold);

    // root文件的写入刷新
    void complete_adding();
};
